<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
</head>
<body>
    <script>
        //     let obj={}
        //   Object.defineProperty(obj,'a',{
        //     get(){
        //         return 'aaa'
        //     },
        //     set(newnum,oldnum){
        //         console.log(newnum,oldnum)

        //     }
        //   })
        //   obj.b='bb';
        //   obj.a='cc';
        //   obj.a='dd'
        //   console.log(obj)
           
        var a={
               a:'aaa'
           }

          let obj1=new Proxy(a,{
              get(target,key){
                //   return target[key]
                  return 'aaa'

              },
              set(target,key,value){
                  console.log(target,key,value,'----------')
                  return target[key]=value;
              }
          })
        //   obj1.b='bb';
          obj1.a='cc';
        //   obj1.a='dd'
          console.log(a,obj1)
        // let obj1 = {
        //     name: 'Eason',
        //     age: 30
        // }
        // let handler = {
        //     get(target, key, receiver) {
        //         // console.log(target, key, receiver,'++++++++++')
        //         console.log(1111111111)
        //         return Reflect.get(target, key, receiver) //Reflect.get 和 Reflect.set 可以理解为类继承里的 super
        //     },
        //     set(target, key, value, receiver) {
        //         console.log(target, key, value, receiver, '--------')
        //         return Reflect.set(target, key, value, receiver) //Reflect.get 和 Reflect.set 可以理解为类继承里的 super
        //     }
        // }
        // let proxy = new Proxy(obj1, handler)
        // proxy.name = 'Zoe' // set name Zoe
        // //proxy.age = 18 // set age 18
        // proxy.sex = '女'

        // console.log(obj1)   //name: "Zoe", age: 18
        // console.log(proxy) //name: "Zoe", age: 18


        // var person = {
        //     name: "张三"
        // };

        // var proxy1= new Proxy(person, {
        //     get: function (target, property,receiver) {
        //         console.log(target, property,receiver,'----**-------')
        //         if (property in target) {
        //             console.debug(target[property],'------------')
        //             return target[property];
        //         } else {
        //             throw new ReferenceError("Property \"" + property + "\" does not exist.");
        //         }
        //     }
        // });
        // console.log(proxy1,person,'=========')
        // proxy1.name='枕上书' // "张三"
        //  proxy1.age // 抛出一个错误

  
        // // 复制代码
        // // 6、set方法用来拦截某个属性的赋值操作。

        // // 复制代码
        // let validator = {
        //     set: function (obj, prop, value) {
        //         if (prop === 'age') {
        //             if (!Number.isInteger(value)) {
        //                 throw new TypeError('The age is not an integer');
        //             }
        //             if (value > 200) {
        //                 throw new RangeError('The age seems invalid');
        //             }
        //         }

        //         // 对于age以外的属性，直接保存
        //         obj[prop] = value;
        //     }
        // };

        // let person2 = new Proxy({}, validator);

        // person2.age = 100;

        // person2.age // 100
        // person2.age = 'young' // 报错
        // person2.age = 300 // 报错
        // // 复制代码
        // // 7、apply方法拦截函数的调用、call和apply操作。apply方法可以接受三个参数，分别是目标对象、目标对象的上下文对象（this）和目标对象的参数数组。
    </script>
</body>
</html>
    

        